﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Servicios;
using Excepciones;
using Dominio;
using UI.Miembros;

namespace UI
{
    public partial class Usuarios : System.Web.UI.Page
    {
        IRolService servicioRol = FabricaDeServicios.ObtenerInstancia().ObtenerRolService();
        IUsuarioService servicioUsuario = FabricaDeServicios.ObtenerInstancia().ObtenerUsuarioService();

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {

                if (Session[ConstantesDeSesion.Usuario] != null)
                {
                    Usuario usuario = (Usuario)Session[ConstantesDeSesion.Usuario];
                    if (((Security)Session[ConstantesDeSesion.Security]).RolPermitido(usuario.Rol, ConstantesFuncionalidades.Usuarios))
                    {
                        CargarUsuarios();
                        CargarRoles();
                        DDL_usuariosExistentes.AutoPostBack = true;
                    }
                    else
                    {
                        //Usuario  no autorizado
                        WebUtils.MsgBox("Usuario no Autorizado");
                        Response.Redirect("~/Miembros/Busquedas.aspx");
                    }
                }
                else
                {
                    //Usuario no autenticado
                    WebUtils.MsgBox("Usuario no Autenticado");
                    Response.Redirect("~/Login.aspx");
                }
            }
            ViewStateMode = System.Web.UI.ViewStateMode.Enabled;

        }

        private void CargarRoles()
        {
            DDL_rol.Items.Clear();
            IList<Rol> rolesDisponibles = servicioRol.ObtenerTodos();
            if (rolesDisponibles.Count == 0)
            {
                //Error en el sistema, no hay roles disponibles
            }
            DDL_rol.DataSource = rolesDisponibles;
            DDL_rol.DataTextField = "Nombre";
            //DDL_rol.DataValueField = "Nombre";
            DDL_rol.DataBind();
        }

        private void CargarUsuarios()
        {
            DDL_usuariosExistentes.Items.Clear();
            IList<Usuario> usuariosExistentes = new List<Usuario>() { new Usuario() { NombreUsuario = ConstantesDeMensajes.SeleccionDummy } };
            foreach (Usuario u in servicioUsuario.ObtenerTodos()) 
            {
                usuariosExistentes.Add(u);
            }
                
            DDL_usuariosExistentes.DataSource = usuariosExistentes;
            DDL_usuariosExistentes.DataTextField = "NombreUsuario";

            DDL_usuariosExistentes.DataBind();

        }

        protected void Button_agregar_Click(object sender, EventArgs e)
        {
            string nombre, apellido, email, usuario, password;
            nombre = TextB_nombre.Text;
            apellido = TextB_apellido.Text;
            email = TextB_mail.Text;
            usuario = TextB_Usuario.Text;
            password = ClaseUtilitaria.Encriptar(TextB_password.Text);
            if (nombre != "" && apellido != "" && email != "" && usuario != "" && password != "")
            {
                Usuario nuevousuario = new Usuario();
                Rol rol = new Rol();
                string nomrol = DDL_rol.SelectedValue;
                rol = servicioRol.ObtenerPorNombre(nomrol);

                try
                {
                    nuevousuario.Nombre = nombre;
                    nuevousuario.Apellido = apellido;
                    nuevousuario.Email = email;
                    nuevousuario.NombreUsuario = usuario;
                    nuevousuario.Password = password;
                    nuevousuario.RolId = rol.Id;
                    servicioUsuario.Registrar(nuevousuario);
                    CargarUsuarios();
                    LimpiarCampos();
                    WebUtils.MsgBox("Usuario agregado con exito");
                }
                catch (DataBaseException ex)
                {
                    WebUtils.MsgBox(ex.Message);
                }
                catch (Exception ex)
                {
                    WebUtils.MsgBox(ConstantesDeMensajes.ErrorInterno);
                }

            }
        }

        protected void Button_eliminar_Click(object sender, EventArgs e)
        {
            if (DDL_usuariosExistentes.SelectedItem != null)
            {
                try
                {
                    string nombreUsuario = DDL_usuariosExistentes.SelectedValue;
                    Usuario usuario = servicioUsuario.ObtenerUsuarioPorUserName(nombreUsuario);
                    servicioUsuario.Borrar(usuario);
                    LimpiarCampos();
                    CargarUsuarios();
                    WebUtils.MsgBox("Usuario eliminado con exito");
                }
                catch (DataBaseException ex)
                {
                    WebUtils.MsgBox(ex.Message);
                }
                catch (Exception ex)
                {
                    WebUtils.MsgBox(ConstantesDeMensajes.ErrorInterno);
                }
            }

        }
        //Este metodo no esta bien, hay que ver como se hace...
        protected void Button_modificar_Click(object sender, EventArgs e)
        {
            if (DDL_usuariosExistentes.SelectedItem != null)
            {
                string nombreUsuario = DDL_usuariosExistentes.SelectedValue;
                Usuario usuario_amodificar = servicioUsuario.ObtenerUsuarioPorUserName(nombreUsuario);
                if (usuario_amodificar != null)
                {

                    string nombre = TextB_nombre.Text;
                    string apellido = TextB_apellido.Text;
                    string email = TextB_mail.Text;
                    string usuario = TextB_Usuario.Text;
                    string password = TextB_password.Text;
                    if (nombre != "" && apellido != "" && email != "" && usuario != "" && password != "")
                    {
                        try
                        {

                            string nomrol = DDL_rol.SelectedValue;
                            Rol rol = servicioRol.ObtenerPorNombre(nomrol);



                            usuario_amodificar.Nombre = nombre;
                            usuario_amodificar.Apellido = apellido;
                            usuario_amodificar.Email = email;
                            usuario_amodificar.NombreUsuario = usuario;
                            usuario_amodificar.Password = password;
                            usuario_amodificar.RolId = rol.Id;
                            servicioUsuario.Modificar(usuario_amodificar);
                            LimpiarCampos();
                            CargarUsuarios();
                            WebUtils.MsgBox("Usuario modificado con exito");
                        }
                        catch (DataBaseException ex)
                        {
                            WebUtils.MsgBox(ex.Message);
                        }
                        catch (Exception ex)
                        {
                            WebUtils.MsgBox(ConstantesDeMensajes.ErrorInterno);
                        }
                    }
                }
            }
        }

        protected void DDL_usuariosExistentes_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (DDL_usuariosExistentes.SelectedValue == ConstantesDeMensajes.SeleccionDummy)
            {
                TextB_nombre.Text = "";
                TextB_apellido.Text = "";
                TextB_mail.Text = "";
                TextB_Usuario.Text = "";
                TextB_password.Text = "";
            }
            else
            {
                string user = DDL_usuariosExistentes.SelectedValue;
                Usuario u = servicioUsuario.ObtenerUsuarioPorUserName(user);
                TextB_nombre.Text = u.Nombre;
                TextB_apellido.Text = u.Apellido;
                TextB_mail.Text = u.Email;
                TextB_Usuario.Text = u.NombreUsuario;
                TextB_password.Text = u.Password;
                DDL_rol.SelectedValue = u.Rol.Nombre;
                DDL_rol.DataBind();
            }
        }

        private void LimpiarCampos()
        {
            TextB_apellido.Text = "";
            TextB_nombre.Text = "";
            TextB_mail.Text = "";
            TextB_password.Text = "";
            TextB_Usuario.Text = "";
            CargarUsuarios();
            CargarRoles();
        }
    }
}